package s.f.contribuyentes;

import java.util.HashMap;
import java.util.Map;

/**
 * Modifica el formato de la palabra dada.
 * @author Froy
 */
public class Formato {

    private static final String REGEXPDIFAZ = "[^A-ZÑ ]";
    private static final String REGEXPTIPOSA = "[ÀÁÂÃÄÅ]";
    private static final String REGEXPTIPOSE = "[ÈÉÊË]";
    private static final String REGEXPTIPOSI = "[ÌÍÎÏ]";
    private static final String REGEXPTIPOSO = "[ÒÓÔÕÖ]";
    private static final String REGEXPTIPOSU = "[ÙÚÛÜ]";
    private static final String REGEXPTRIMPUNTO = "^[\\.]"; //^[\\.] [\\.$]
    private static final String REGEXPESPECIALES = "[@%°!#$%&/()=?¡]";
    private static final String REGEXPDIFAZMORE = "[^A-ZÑ /'-.]";
    private static final String REGEXPDIFESPCIALES = "[/'-.]";

    /**
     * <p>Convierte a mayúsculas, remplaza las vocales con acentos elimina
     * articulos y conjunciones</p> 
     * <p> <a href="http://www.utf8-chartable.de/">Caracteres UTF-8</a></p>
     *
     * @param palabra
     * @return palabra formateada.
     */
    public static String PalabraRFCFisica(String palabra) {
        return palabra.toUpperCase().replaceAll(REGEXPTIPOSA, "A").replaceAll(REGEXPTIPOSE, "E").replaceAll(REGEXPTIPOSI, "I").replaceAll(REGEXPTIPOSO, "O").replaceAll(REGEXPTIPOSU, "U").replace("Ý", "Y").replace("Ð", "D").replace("DE LOS ", "").replace("DE LA ", "").replace("DEL ", "").replace("Y ", "").replaceAll(REGEXPDIFAZ, "").trim();
    }
    
    /**
     * Convierte a mayúsculas y remplaza las vocales con acentos.
     *
     * @param palabra
     * @return info: http://www.utf8-chartable.de/
     */
    public static String PalabraRFCMoral(String palabra) {
        return palabra.toUpperCase().replaceAll(REGEXPTIPOSA, "A").replaceAll(REGEXPTIPOSE, "E").replaceAll(REGEXPTIPOSI, "I").replaceAll(REGEXPTIPOSO, "O").replaceAll(REGEXPTIPOSU, "U").replaceAll(REGEXPESPECIALES, "").replace(" S. EN N.C.", " ").replace(" S. EN C.", " ").replace(" S. DE R.L.", " ").replace(" S. EN C. POR A.", " ").replace(" S.A. DE C.V.", " ").replace(" S.A.", " ").replace(" C.V.", " ").replace(" S.N.C.", " ").replace(" S.C.", " ").replace(" A.C.", " ").replace(" A. EN P.", " ").replace(" S.C.L.", " ").replace(" S.C.S.", " ").replace("Ý", "Y").replace("Ð", "D").replace(" DA ", " ").replace(" DAS ", " ").replace(" PARA ", " ").replace(" DE ", " ").replace(" DEL ", " ").replace(" DER ", " ").replace(" DI ", " ").replace(" DIE ", " ").replace(" DD ", " ").replace("EL ", " ").replace("CIA.", "").replace("COMPAÑIA", "").replace("SOCIEDAD", "").replace("SOC.", "").replace(" EL ", " ").replace("LA ", " ").replace(" LA ", " ").replace(" LOS ", " ").replace(" LOS ", "").replace(" LAS ", " ").replace(" LE ", " ").replace(" LES ", " ").replace(" MAC ", " ").replace(" MC ", " ").replace(" VAN ", " ").replace(" VON ", " ").replace(" Y ", " ").replace(",", "").replace("COOPERATIVA", "").replaceAll(REGEXPTRIMPUNTO, "").trim();
    }

    /**
     * <p>Convierte a mayúsculas, remplaza las vocales con acentos elimina
     * articulos y conjunciones</p> 
     * <p> <a href="http://www.utf8-chartable.de/">Caracteres UTF-8</a></p>
     *
     * @param palabra
     * @return info: http://www.utf8-chartable.de/
     */
    public static String PalabraCURP(String palabra) {

        palabra = palabra.toUpperCase().replaceAll(REGEXPTIPOSA, "A").replaceAll(REGEXPTIPOSE, "E").replaceAll(REGEXPTIPOSI, "I").replaceAll(REGEXPTIPOSO, "O").replaceAll(REGEXPTIPOSU, "U").replace("Ý", "Y").replace("Ð", "D").replace("DA ", "").replace("DAS ", "").replace("DE ", "").replace("DEL ", "").replace("DER ", "").replace("DI ", "").replace("DIE ", "").replace("DD ", "").replace("EL ", "").replace("LA ", "").replace("LOS ", "").replace("LAS ", "").replace("LE ", "").replace("LES ", "").replace("MAC ", "").replace("MC ", "").replace("VAN ", "").replace("VON ", "").replace("Y ", "").replaceAll(REGEXPDIFAZMORE, "") /*
                 * Si en los apellidos o en el nombre aparecieran "caracteres
                 * especiales" como (/)(-)(.)(') se capturan tal cual viene en
                 * el documento y la aplicación asignará una "X". Ejem. JUAN
                 * JOSE D/AMICO ALVAREZ DXAJ
                 */.replaceAll(REGEXPDIFESPCIALES, "X").trim();
        /*
         * Si la "letra inicial" de alguno de los apellidos o del nombre es Ñ ,
         * el sistema asignará una "X" en su lugar. ALBERTO ÑANDO RODRIGUEZ XARA
         */
        if (!palabra.isEmpty()) {
            palabra = (palabra.charAt(0) == 'Ñ') ? palabra.replace("Ñ", "X") : palabra;
        }

        return palabra;
    }

    /**
     * Revisa si la palabra es inconveniente o no.
     *
     * @param palabra Primeras 4 letras del RFC de la persona fiscia.
     * @return
     */
    public static String palabrasInconvenientesRFC(String palabra) {
        Map mapInconvenientes = new HashMap();

        mapInconvenientes.put("BUEI", "BUEX");
        mapInconvenientes.put("BUEY", "BUEX");
        mapInconvenientes.put("CACA", "CACX");
        mapInconvenientes.put("CACO", "CACX");
        mapInconvenientes.put("CAGA", "CAGX");
        mapInconvenientes.put("CAKA", "CAKX");
        mapInconvenientes.put("COGE", "COGX");
        mapInconvenientes.put("COJA", "COJX");
        mapInconvenientes.put("COJE", "COJX");
        mapInconvenientes.put("COJI", "COJX");
        mapInconvenientes.put("COJO", "COJX");
        mapInconvenientes.put("CULO", "CULX");
        mapInconvenientes.put("FETO", "FETX");
        mapInconvenientes.put("GUEY", "GUEX");
        mapInconvenientes.put("JOTO", "JOTX");
        mapInconvenientes.put("KACA", "KACX");
        mapInconvenientes.put("KACO", "KACX");
        mapInconvenientes.put("KAGA", "KAGX");
        mapInconvenientes.put("KAGO", "KAGX");
        mapInconvenientes.put("KOGE", "KOGX");
        mapInconvenientes.put("KOJO", "KOJX");
        mapInconvenientes.put("KAKA", "KAKX");
        mapInconvenientes.put("KULO", "KULX");
        mapInconvenientes.put("KAKA", "KAKX");
        mapInconvenientes.put("KULO", "KULX");
        mapInconvenientes.put("MAME", "MAMX");
        mapInconvenientes.put("MAMO", "MAMX");
        mapInconvenientes.put("MEAR", "MEAX");
        mapInconvenientes.put("MEON", "MEOX");
        mapInconvenientes.put("MION", "MIOX");
        mapInconvenientes.put("MOCO", "MOCX");
        mapInconvenientes.put("MULA", "MULX");
        mapInconvenientes.put("PEDA", "PEDX");
        mapInconvenientes.put("PEDO", "PEDX");
        mapInconvenientes.put("PENE", "PENX");
        mapInconvenientes.put("PUTA", "PUTX");
        mapInconvenientes.put("PUTO", "PUTX");
        mapInconvenientes.put("QULO", "QULX");
        mapInconvenientes.put("RATA", "RATX");
        mapInconvenientes.put("RUIN", "RUIX");

        return (mapInconvenientes.containsKey(palabra))
                ? String.valueOf(mapInconvenientes.get(palabra)) : palabra;
    }
    
    /**
     * Revisa si la palabra es inconveniente o no.
     *
     * @param palabra Primeras 4 letras de la CURP.
     * @return
     */
    public static String palabrasInconvenientesCURP(String palabra) {
        Map mapInconvenientes = new HashMap();

        mapInconvenientes.put("BACA", "BXCA");
        mapInconvenientes.put("BAKA", "BXKA");
        mapInconvenientes.put("BUEI", "BXEI");
        mapInconvenientes.put("BUEY", "BXEY");
        mapInconvenientes.put("CACA", "CXCA");
        mapInconvenientes.put("CACO", "CXCO");
        mapInconvenientes.put("CAGA", "CXGA");
        mapInconvenientes.put("CAGO", "CXGO");
        mapInconvenientes.put("CAKA", "CXKA");
        mapInconvenientes.put("CAKO", "CXKO");
        mapInconvenientes.put("CAGE", "CXGE");
        mapInconvenientes.put("CAGI", "CXGI");
        mapInconvenientes.put("COJA", "CXJA");
        mapInconvenientes.put("COJE", "CXJE");
        mapInconvenientes.put("COJI", "CXJI");
        mapInconvenientes.put("COJO", "CXJO");
        mapInconvenientes.put("COLA", "CXLA");
        mapInconvenientes.put("CULO", "CXLO");
        mapInconvenientes.put("FALO", "FXLO");
        mapInconvenientes.put("FETO", "FXTO");
        mapInconvenientes.put("GETA", "GXTA");
        mapInconvenientes.put("GUEI", "GXEI");
        mapInconvenientes.put("GUEY", "GXEY");
        mapInconvenientes.put("JETA", "JXTA");
        mapInconvenientes.put("JOTO", "JXTO");
        mapInconvenientes.put("KACA", "KXCA");
        mapInconvenientes.put("KACO", "KXCO");
        mapInconvenientes.put("KAGA", "KXGA");
        mapInconvenientes.put("KAGO", "KXGO");
        mapInconvenientes.put("KAKA", "KXKA");
        mapInconvenientes.put("KAKO", "KXKO");
        mapInconvenientes.put("KOGE", "KXGE");
        mapInconvenientes.put("KOGI", "KXGI");
        mapInconvenientes.put("KOJA", "KXJA");
        mapInconvenientes.put("KOJE", "KXJE");
        mapInconvenientes.put("KOJI", "KXJI");
        mapInconvenientes.put("KOJO", "KXJO");
        mapInconvenientes.put("KOLA", "KXLA");
        mapInconvenientes.put("KULO", "KXLO");
        mapInconvenientes.put("LILO", "LXLO");
        mapInconvenientes.put("LOCA", "LXCA");
        mapInconvenientes.put("LOCO", "LXCO");
        mapInconvenientes.put("LOKA", "LXKA");
        mapInconvenientes.put("LOKO", "LXKO");
        mapInconvenientes.put("MAME", "MXME");
        mapInconvenientes.put("MAMO", "MXMO");
        mapInconvenientes.put("MEAR", "MXAR");
        mapInconvenientes.put("MEAS", "MXAS");
        mapInconvenientes.put("MEON", "MXON");
        mapInconvenientes.put("MIAR", "MXAR");
        mapInconvenientes.put("MION", "MXON");
        mapInconvenientes.put("MOCO", "MXCO");
        mapInconvenientes.put("MOKO", "MXKO");
        mapInconvenientes.put("MULA", "MXLA");
        mapInconvenientes.put("MULO", "MXLO");
        mapInconvenientes.put("NACA", "NXCA");
        mapInconvenientes.put("NACO", "NXCO");
        mapInconvenientes.put("PEDA", "PXDA");
        mapInconvenientes.put("PEDO", "PXDO");
        mapInconvenientes.put("PENE", "PXNE");
        mapInconvenientes.put("PIPI", "PXPI");
        mapInconvenientes.put("PITO", "PXTO");
        mapInconvenientes.put("PIPO", "PXPO");
        mapInconvenientes.put("PUTA", "PXTA");
        mapInconvenientes.put("PUTO", "PXTO");
        mapInconvenientes.put("QULO", "QXLO");
        mapInconvenientes.put("RATA", "RXTA");
        mapInconvenientes.put("ROBA", "RXBA");
        mapInconvenientes.put("ROBE", "RXBE");
        mapInconvenientes.put("RUIN", "RXIN");
        mapInconvenientes.put("SENO", "SXNO");
        mapInconvenientes.put("TETA", "TXTA");
        mapInconvenientes.put("VACA", "VXCA");
        mapInconvenientes.put("VAGA", "VXGA");
        mapInconvenientes.put("VAGO", "VXGO");
        mapInconvenientes.put("VAKA", "VXKA");
        mapInconvenientes.put("VUEI", "VXEI");
        mapInconvenientes.put("VUEY", "VXEY");
        mapInconvenientes.put("WUEI", "WXEI");
        mapInconvenientes.put("WUEY", "WXEY");

        return (mapInconvenientes.containsKey(palabra))
                ? String.valueOf(mapInconvenientes.get(palabra)) : palabra;
    }
}
